package org.openehealth.ipf.platform.camel.flow.admin.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.ui.*;
import java.util.*;
import static org.openehealth.ipf.platform.camel.flow.admin.client.JSONUtil.toStringList;
public class IpfFlowAdmin implements EntryPoint {
private final SelectableGrid appsGrid = new SelectableGrid();
private final SelectableGrid msgGrid = new SelectableGrid();
private final SelectableGrid flowGrid = new SelectableGrid();
private final InlineLabel msgDelete = new InlineLabel("delete");
private final InlineLabel msgReplay = new InlineLabel("replay");
private final FlowPanel msgButtons = new FlowPanel();
private final FlowPanel msgAndFlowPanel = new FlowPanel();
private final FlowPanel msgPanel = new FlowPanel();
private final FlowPanel flowPanel = new FlowPanel();
private Integer curMsgIdx;
private Integer curAppIdx;
private Panel appPanel;
private Panel appHeader;
private JSONObject lastMsgForPaging;
private JSONObject lastFlowForPaging;
private int pageSize = 10;
public void onModuleLoad() {
configureMsgButtons();
configureAppsGrid();
configureMsgGrid();
configureFlowGrid();
configureMsgAndFlowPanel();
RootPanel.get().add(msgAndFlowPanel);
RootPanel.get().add(appHeader);
RootPanel.get().add(appPanel);
RootPanel.get().add(msgButtons);
}
private void configureMsgAndFlowPanel() {
msgAndFlowPanel.setStyleName("msgAndFlowPanel");
msgAndFlowPanel.add(msgPanel);
msgAndFlowPanel.add(flowPanel);
}
private void configureMsgButtons() {
msgButtons.setStyleName("msgButtons");
msgButtons.add(msgDelete);
msgButtons.add(msgReplay);
msgDelete.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
if (curMsgIdx != null) {
deleteCurMsg();
}
}
});
msgReplay.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
if (curMsgIdx != null) {
replayCurMsg();
}
}
});
updateMsgsButtons();
}
private void updateMsgsButtons() {
msgDelete.setStyleName(curMsgIdx == null ? "disabledTextButton" : "textButton");
msgReplay.setStyleName(curMsgIdx == null ? "disabledTextButton" : "textButton");
}
private Panel wrap(Widget widget) {
FlowPanel panel = new FlowPanel();
panel.add(widget);
return panel;
}
private void configureAppsGrid() {
appPanel = wrap(appsGrid.getHeaderGrid());
appHeader = wrap(appsGrid.getGrid());
appPanel.setStyleName("appsGridHeader");
appHeader.setStyleName("appsGrid");
appsGrid.getGrid().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
HTMLTable.Cell cell = appsGrid.getGrid().getCellForEvent(clickEvent);
curAppIdx = cell.getRowIndex();
updateMsgGrid();
}
});
updateAppsGrid();
}
private void updateAppsGrid() {
new Rest("/rest/applications").get(new GetCallback() {
@Override
protected void onSuccess(Response response) {
JSONArray results = getResultsFromResponse(response);
List<String> appIds = toStringList(results);
List<List<String>> contents = new ArrayList<List<String>>();
for (String appId : appIds) {
contents.add(Collections.singletonList(appId));
}
appsGrid.setContents(
Collections.singletonList("AppId"),
contents,
Collections.singletonList("100%"));
}
});
}
private void configureMsgGrid() {
final Panel msgHeaderPanel = wrap(msgGrid.getHeaderGrid());
final Panel msgGridPanel = wrap(msgGrid.getGrid());
msgHeaderPanel.setStyleName("msgGridHeader");
msgGridPanel.setStyleName("msgGrid");
msgPanel.add(msgHeaderPanel);
msgPanel.add(msgGridPanel);
msgPanel.setStyleName("msgPanel");
msgGrid.getGrid().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
HTMLTable.Cell cell = msgGrid.getGrid().getCellForEvent(clickEvent);
if (lastMsgForPaging != null && cell.getRowIndex() == msgGrid.getGrid().getRowCount() - 1) {
addMoreMsgsToGrid();
}
else {
curMsgIdx = cell.getRowIndex();
updateMsgsButtons();
updateFlowGrid();
}
}
});
}
private String getCurAppId() {
return appsGrid.getGrid().getText(curAppIdx, 0);
}
private String getCurMsgId() {
return msgGrid.getGrid().getText(curMsgIdx, 1);
}
private void updateMsgGrid() {
resetMsgGridSelection();
String url = "/rest/messages?application=" + getCurAppId() + "&limit=" + pageSize;
new Rest(url).get(new GetCallback() {
@Override
protected void onSuccess(Response response) {
JSONArray results = getResultsFromResponse(response);
lastMsgForPaging = getIteratorFromResponse(response);
msgGrid.setContents(
Arrays.asList("Created", "MsgId", "Replayed"), getMsgGridContents(results),
Arrays.asList("30%", "40%", "30%"));
}
});
}
private void resetMsgGridSelection() {
msgGrid.deselect();
flowGrid.clear();
curMsgIdx = null;
updateMsgsButtons();
}
private void addMoreMsgsToGrid() {
resetMsgGridSelection();
String url = "/rest/messages?application=" + getCurAppId() + "&limit=" + pageSize + "&start=" + lastMsgForPaging;
new Rest(url).get(new GetCallback() {
@Override
protected void onSuccess(Response response) {
JSONArray jsonArray = getResultsFromResponse(response);
lastMsgForPaging = getIteratorFromResponse(response);
msgGrid.getGrid().resize(msgGrid.getGrid().getRowCount() - 1, msgGrid.getGrid().getColumnCount());
msgGrid.addContents(getMsgGridContents(jsonArray));
}
});
}
private List<List<String>> getMsgGridContents(JSONArray jsonArray) {
List<List<String>> contents = new ArrayList<List<String>>();
for (int idx = 0; idx < jsonArray.size(); ++idx) {
JSONObject jsonMsg = jsonArray.get(idx).isObject();
contents.add(getMsgContent(jsonMsg));
}
if (lastMsgForPaging != null) {
contents.add(Arrays.asList("...", "...", "..."));
}
return contents;
}
private List<String> getMsgContent(JSONObject jsonMsg) {
return Arrays.asList(
toDate(jsonMsg.get("creationDate").isNumber().toString()),
jsonMsg.get("_id").isString().stringValue(),
jsonMsg.get("replayCount").isNumber().toString()
);
}
private void deleteCurMsg() {
new Rest("/rest/messages/" + getCurMsgId()).delete(new DeleteCallback() {
@Override
protected void onSuccess(Response response) {
msgGrid.remove(curMsgIdx);
resetMsgGridSelection();
}
});
}
private void replayCurMsg() {
final String curMsgId = getCurMsgId();
new Rest("/rest/replayQueue").post("[\"" + curMsgId + "\"]", new PostCallback() {
@Override
protected void onSuccess(Response response) {
new Rest("/rest/messages/" + curMsgId).get(new GetCallback() {
@Override
protected void onSuccess(Response response) {
JSONObject jsonMsg = JSONParser.parse(response.getText()).isObject();
List<String> content = getMsgContent(jsonMsg);
msgGrid.replace(curMsgIdx, content);
updateFlowGrid();
}
});
}
});
}
private void configureFlowGrid() {
final Panel flowHeaderPanel = wrap(flowGrid.getHeaderGrid());
final Panel flowGridPanel = wrap(flowGrid.getGrid());
flowHeaderPanel.setStyleName("flowGridHeader");
flowGridPanel.setStyleName("flowGrid");
flowPanel.add(flowHeaderPanel);
flowPanel.add(flowGridPanel);
flowPanel.setStyleName("flowPanel");
flowGrid.getGrid().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
HTMLTable.Cell cell = flowGrid.getGrid().getCellForEvent(clickEvent);
if (lastFlowForPaging != null && cell.getRowIndex() == flowGrid.getGrid().getRowCount() - 1) {
addMoreFlowsToGrid();
}
else {
updateFlowButtons();
}
}
});
}
private void updateFlowGrid() {
resetFlowGridSelection();
String url = "/rest/flows?message=" + getCurMsgId() + "&limit=" + pageSize;
new Rest(url).get(new GetCallback() {
@Override
protected void onSuccess(Response response) {
JSONArray jsonArray = getResultsFromResponse(response);
lastFlowForPaging = getIteratorFromResponse(response);
flowGrid.setContents(
Arrays.asList("Created", "FlowId", "Ack/Nak"),
getFlowGridContents(jsonArray),
Arrays.asList("30%", "40%", "30%"));
}
});
}
private List<List<String>> getFlowGridContents(JSONArray jsonArray) {
List<List<String>> contents = new ArrayList<List<String>>();
for (int idx = 0; idx < jsonArray.size(); ++idx) {
JSONObject jsonFlow = jsonArray.get(idx).isObject();
if (jsonFlow != null) {
contents.add(getFlowContent(jsonFlow));
}
}
if (lastFlowForPaging != null) {
contents.add(Arrays.asList("...", "...", "..."));
}
return contents;
}
private List<String> getFlowContent(JSONObject jsonFlow) {
boolean ack = jsonFlow.get("ack").isBoolean().booleanValue();
boolean nak = jsonFlow.get("nak").isBoolean().booleanValue();
return Arrays.asList(
toDate(jsonFlow.get("creationDate").isNumber().toString()),
jsonFlow.get("_id").isString().stringValue(),
ack ? "ack" : nak ? "nak" : "-"
);
}
private void resetFlowGridSelection() {
flowGrid.deselect();
updateFlowButtons();
}
private void updateFlowButtons() {
}
private void addMoreFlowsToGrid() {
resetFlowGridSelection();
String url = "/rest/flows?message=" + getCurMsgId() + "&limit=" + pageSize + "&start=" + lastFlowForPaging;
new Rest(url).get(new GetCallback() {
@Override
protected void onSuccess(Response response) {
JSONArray jsonArray = getResultsFromResponse(response);
lastFlowForPaging = getIteratorFromResponse(response);
flowGrid.getGrid().resize(flowGrid.getGrid().getRowCount() - 1, flowGrid.getGrid().getColumnCount());
flowGrid.addContents(getFlowGridContents(jsonArray));
}
});
}
private String toDate(String value) {
return DateTimeFormat.getMediumDateTimeFormat().format(new Date(Long.parseLong(value)));
}
private JSONArray getResultsFromResponse(Response response) {
return JSONParser.parse(response.getText()).isObject().get("results").isArray();
}
private JSONObject getIteratorFromResponse(Response response) {
JSONValue value = JSONParser.parse(response.getText()).isObject().get("iterator");
return value != null ? value.isObject() : null;
}
}